home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Sample Code / AOCE Sample Code / PowerTalk Access Modules / Sample SMSAM / SampleSMSAM Source / TupleDatabase / HFSTupleDatabase.cp < prev    next >
Encoding:
Text File  |  1995-07-28  |  7.3 KB  |  249 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        HFSTupleDatabase.cp
  3.  
  4.     Copyright:    © 1991-1994 by Apple Computer, Inc.
  5.                 All rights reserved.
  6.  
  7.     Part of the AOCE Sample SMSAM Package.  Consult the license
  8.     which came with this software for your specific legal rights.
  9.  
  10. */
  11.  
  12.  
  13.  
  14. #ifndef __HFSTUPLEDATABASE__
  15. #include "HFSTupleDatabase.h"
  16. #endif
  17.  
  18. #ifndef __ABSTRACTFILE__
  19. #include "AbstractFile.h"
  20. #endif
  21.  
  22. #ifndef    __DEBUGASSERT__
  23. #include "DebugAssert.h"
  24. #endif
  25.  
  26. #ifndef    __HANDLEOBJECTOWNER__
  27. #include "HandleObjectOwner.h"
  28. #endif
  29.  
  30. #ifndef __BUFFER__
  31. #include "Buffer.h"
  32. #endif
  33.  
  34. #ifndef    __DATAITEM__
  35. #include "DataItem.h"
  36. #endif
  37.  
  38. /***********************************|****************************************/
  39.  
  40. #pragma segment HFSTupleDatabase
  41.  
  42. /***********************************|****************************************/
  43.  
  44. //    Write this function since PLstrchr seems to have a bug in it and
  45. //    (ocassionally) goes past the end of the Str255 looking for the
  46. //    character.
  47. static Boolean IsInStr255 ( const StringPtr str, const char c )
  48. {
  49.     for ( unsigned i = str[0]; i ; -- i )
  50.         if ( str[i] == c )
  51.             return true;
  52.     return false;
  53. }
  54.  
  55. /***********************************|****************************************/
  56.  
  57. Boolean 
  58. CanBeUsedForHFSFileName ( const StringPtr name )
  59. {
  60.     Boolean result = ( name [ 0 ] >= 1 ) && ( name [ 0 ] <= sizeof ( Str32 ) && ( IsInStr255(name, ':') == false ));
  61.     
  62.     #if debug
  63.     if ( result == false )
  64.         keithDB ( "THFSTupleDatabase::CanBeUsedForHFSFileName(" << name << ") == false" );
  65.     #endif
  66.     
  67.     return result;
  68. }
  69.  
  70. /***********************************|****************************************/
  71.  
  72. THFSTupleDatabase::THFSTupleDatabase ():
  73.     ATupleDatabase (),
  74.     fFolderSpec ()
  75. {
  76. }
  77.  
  78. /***********************************|****************************************/
  79.  
  80. THFSTupleDatabase::THFSTupleDatabase ( const TFolderSpec& folderSpec ):
  81.     ATupleDatabase (),
  82.     fFolderSpec ( folderSpec )
  83. {
  84.     fFolderSpec.CreateFolder ();
  85. }
  86.  
  87. /***********************************|****************************************/
  88.  
  89. THFSTupleDatabase::~THFSTupleDatabase()
  90. {
  91. }
  92.  
  93. /***********************************|****************************************/
  94.  
  95. Boolean 
  96. THFSTupleDatabase::GetTupleDataSize ( const ATupleKey& key, unsigned long &dataSize ) 
  97. {    
  98.     CPrefixDataItem fileNameKey ( key.GetData(), key.GetLength(), CPrefixDataItem::kByte );
  99.     ASSERT_RETURN_ZERO ( CanBeUsedForHFSFileName ( (const StringPtr) fileNameKey.GetPhysicalStart() ) );
  100.     if (DoesTupleExist(key)) {
  101.         return TFileSpec ( fFolderSpec.GetVolume (), fFolderSpec.GetID (), (StringPtr) fileNameKey.GetPhysicalStart () ).GetLogicalSize ( dataSize );
  102.     };
  103.     return false;
  104. }
  105.  
  106. /***********************************|****************************************/
  107.  
  108. Boolean 
  109. THFSTupleDatabase::SetTuple ( const ATupleKey& key, const ADataItem& data ) 
  110. {    CPrefixDataItem fileNameKey ( key.GetData(), key.GetLength(), CPrefixDataItem::kByte );
  111.     ASSERT_RETURN_ZERO ( CanBeUsedForHFSFileName ( (const StringPtr) fileNameKey.GetPhysicalStart() ) );
  112.     TForkFile* file = new TForkFile ( fFolderSpec.GetVolume (), fFolderSpec.GetID (), (StringPtr) fileNameKey.GetPhysicalStart ());
  113.     THandleObjectOwner owner ( file );
  114.     
  115.     if ( file->WriteDataIgnore ( data.GetPhysicalStart (), data.GetPhysicalLength () ) == noErr )
  116.     {    FInfo fileInfo;
  117.         
  118.         //    Encode the data type as the file type.
  119.         if (HGetFInfo(fFolderSpec.GetVolume(), fFolderSpec.GetID(), (StringPtr) fileNameKey.GetPhysicalStart (), &fileInfo) == noErr)
  120.         {    fileInfo.fdType = data.GetDataType();
  121.             HSetFInfo(fFolderSpec.GetVolume(), fFolderSpec.GetID(), (StringPtr) fileNameKey.GetPhysicalStart (), &fileInfo);
  122.         }
  123.         
  124.         return file->SetEnd ( data.GetPhysicalLength () ) == noErr;
  125.     }
  126.  
  127.     return false;
  128. }
  129.  
  130. /***********************************|****************************************/
  131.  
  132. Boolean 
  133. THFSTupleDatabase::GetTupleData ( const ATupleKey& key, ADataItem& data ) 
  134. {    CPrefixDataItem fileNameKey ( key.GetData(), key.GetLength(), CPrefixDataItem::kByte );
  135.     ASSERT_RETURN_ZERO ( CanBeUsedForHFSFileName ( (const StringPtr) fileNameKey.GetPhysicalStart() ) );
  136.     
  137.     if (DoesTupleExist(key)) {
  138.         TForkFile* file = new TForkFile ( fFolderSpec.GetVolume (), fFolderSpec.GetID (), (StringPtr) fileNameKey.GetPhysicalStart () );
  139.         THandleObjectOwner owner ( file );
  140.         
  141.         long length = 0;
  142.         
  143.         if ( file->GetEnd ( length ) == noErr )
  144.             if ( data.SetPhysicalLength ( length ) == length )
  145.             {    FInfo fileInfo;
  146.                 //    Get the datatype from the file type
  147.                 if (HGetFInfo(fFolderSpec.GetVolume(), fFolderSpec.GetID(), (StringPtr) fileNameKey.GetPhysicalStart (), &fileInfo) == noErr)
  148.                     data.SetDataType(fileInfo.fdType);
  149.                 return file->ReadDataIgnore ( (void*) data.GetPhysicalStart (), length ) == noErr;
  150.             }
  151.     };
  152.     
  153.     return false;
  154. }
  155.  
  156. /***********************************|****************************************/
  157.  
  158. Boolean 
  159. THFSTupleDatabase::DeleteTuple ( const ATupleKey& key ) 
  160. {    CPrefixDataItem fileNameKey ( key.GetData(), key.GetLength(), CPrefixDataItem::kByte );
  161.     ASSERT_RETURN_ZERO ( CanBeUsedForHFSFileName ( (const StringPtr) fileNameKey.GetPhysicalStart() ) );
  162.     return TFileSpec ( fFolderSpec.GetVolume (), fFolderSpec.GetID (), (StringPtr) fileNameKey.GetPhysicalStart () ).DeleteFile ();
  163. }
  164.  
  165. /***********************************|****************************************/
  166.  
  167. unsigned long 
  168. THFSTupleDatabase::CountTuples ()  const
  169. {
  170.     return fFolderSpec.CountChildrenFiles ();
  171. }
  172.  
  173. /***********************************|****************************************/
  174.  
  175. Boolean 
  176. THFSTupleDatabase::GetTupleKey ( unsigned long index, ATupleKey& key ) 
  177. {
  178.     TFileSpec file;
  179.     
  180.     if ( fFolderSpec.GetChildFile ( index, file ) )
  181.     {
  182.         StringPtr fileName = file.GetPName () ;
  183.         key.SetData ( & fileName [ 1 ], fileName [ 0 ] );
  184.         return true;
  185.     }
  186.     else
  187.         return false;
  188. }
  189.  
  190. /***********************************|****************************************/
  191.  
  192. Boolean 
  193. THFSTupleDatabase::FindIndexOfTuple ( const ATupleKey& key, unsigned long& index ) const
  194. {    CPrefixDataItem fileNameKey ( key.GetData(), key.GetLength(), CPrefixDataItem::kByte );
  195.     ASSERT_RETURN_ZERO ( CanBeUsedForHFSFileName ( (const StringPtr) fileNameKey.GetPhysicalStart() ) );
  196.     TFileSpec keyFile ( fFolderSpec.GetVolume (), fFolderSpec.GetID (), (StringPtr) fileNameKey.GetPhysicalStart () );
  197.     TFolderFileIterator iterator ( fFolderSpec );
  198.     const TFileSpec* file;
  199.     
  200.     index = 1;
  201.     
  202.     for ( file = iterator.FirstFile ();
  203.           file != nil;
  204.           file = iterator.NextFile () )
  205.     {
  206.         if ( *file == keyFile )
  207.             return true;
  208.         else
  209.             index++;
  210.     }
  211.  
  212.     index = 0;
  213.     return false; 
  214. }
  215.  
  216. /***********************************|****************************************/
  217.  
  218. Boolean
  219. THFSTupleDatabase::DeleteDatabase ()
  220. {
  221.     return fFolderSpec.DeleteFolder ();
  222. }
  223.  
  224. /***********************************|****************************************/
  225.  
  226. void THFSTupleDatabase::Flush () 
  227. {
  228. }
  229.  
  230. /***********************************|****************************************/
  231.  
  232. ostream&
  233. THFSTupleDatabase::operator >> ( ostream& stream ) const
  234. {
  235.     return ATupleDatabase::operator >> ( stream );
  236. }
  237.  
  238. /***********************************|****************************************/
  239.  
  240. Boolean 
  241. THFSTupleDatabase::DoesTupleExist ( const ATupleKey& key ) const
  242. {    
  243.     CPrefixDataItem fileNameKey ( key.GetData(), key.GetLength(), CPrefixDataItem::kByte );
  244.     ASSERT_RETURN_ZERO ( CanBeUsedForHFSFileName ( (const StringPtr) fileNameKey.GetPhysicalStart() ) );
  245.     return TFileSpec ( fFolderSpec.GetVolume (), fFolderSpec.GetID (), (StringPtr) fileNameKey.GetPhysicalStart ()).DoesFileExist ();
  246. }
  247.  
  248. /***********************************|****************************************/
  249.